package com.atguigu.tingshu.search.receiver;

import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.search.service.SearchService;
import com.rabbitmq.client.Channel;
import lombok.SneakyThrows;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class SearchReceiver {
    @Autowired
    private SearchService searchService;

    /*
    * 上架专辑
    * 通过RabbitMQ消费者监听上架专辑的消息，收到消息后调用searchService中的upperAlbum方法进行上架操作
    *
    * @param albumId 专辑ID，标识需要上架的专辑
    * @param message 消息对象，用于获取消息属性
    * @param channel 消息通道，用于确认消息处理完成
    * */
    @SneakyThrows
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(value = MqConst.EXCHANGE_ALBUM, durable = "true"),
            value = @Queue(value = MqConst.QUEUE_ALBUM_UPPER, durable = "true"),
            key = {MqConst.ROUTING_ALBUM_UPPER}
    ))
    public void upperAlbum(Long albumId, Message message, Channel channel) {
        try {
            // 检查专辑ID是否为非空，非空则调用searchService进行上架操作
            if (null != albumId) {
                searchService.upperAlbum(albumId);
            }
        } catch (Exception e) {
            // 捕获异常并重新抛出，交由上层处理
            throw new RuntimeException(e);
        }
        // 确认消息处理完成，避免消息重新投递
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);     //第三个参数，是否重回队列，还可以借助redis计算重回次数，如果到达上线，直接采用异常消息表记录、人工处理！
    }


    /*
    * 下架专辑
    * 通过RabbitMQ消息监听的方式，接收下架专辑的请求，并调用相关服务进行处理。
    * 参数:
    *   albumId - 需要下架的专辑的ID
    *   message - 消息内容，用于获取消息的属性
    *   channel - 消息通道，用于确认消息处理完成
    * 异常:
    *   RuntimeException - 当处理专辑下架操作时发生异常，抛出运行时异常
    * */
    @SneakyThrows
    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange(value = MqConst.EXCHANGE_ALBUM, durable = "true"),
            value = @Queue(value = MqConst.QUEUE_ALBUM_LOWER, durable = "true"),
            key = {MqConst.ROUTING_ALBUM_LOWER}
    ))
    public void lowerAlbum(Long albumId, Message message, Channel channel) {
        try {
            // 检查专辑ID是否非空，避免不必要的操作
            if (null != albumId) {
                // 调用搜索服务的下架专辑方法，将专辑从搜索索引中移除
                searchService.lowerAlbum(albumId);
            }
        } catch (Exception e) {
            // 当发生异常时，将其封装为RuntimeException后抛出
            throw new RuntimeException(e);
        }
        // 确认消息处理成功，通知RabbitMQ可以安全地丢弃消息
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //第三个参数，是否重回队列，还可以借助redis计算重回次数，如果到达上线，直接采用异常消息表记录、人工处理！
    }

}


